function deepEqual(val1, val2) {
    if (typeof val1 !== typeof val2) {
        return false;
    }

    // Array comparison.
    if (Array.isArray(val1) && Array.isArray(val2)) {
        if (val1.length !== val2.length) {
            return false;
        }
        for (let i = 0; i < val1.length; i++) {
            if (!deepEqual(val1[i], val2[i])) {
                return false;
            }
        }
        return true;
    }

    // Object comparison.
    if (typeof val1 === 'object' && typeof val2 === 'object' && val1 !== null && val2 !== null) {
        const keys1 = Object.keys(val1), keys2 = Object.keys(val2);
        if (keys1.length !== keys2.length) {
            return false;
        }
        for (let i = 0; i < keys1.length; i++) {
            if (!deepEqual(val1[keys1[i]], val2[keys2[i]])) {
                return false;
            }
        }
        return true;
    }

    // Primitive comparison.
    return val1 === val2;
}

module.exports = deepEqual;
